﻿package zf.data.ds
{
	import zf.data.ds.node.SListNode;

	/**
	 * 单向链表指针类，实现指针的移动操作 
	 * @author Mike.zhang
	 * @langversion 3.0 
	 * @playerversion Flash 9 
	 * @see SLinkedList
	 */
	public class SListPointer
	{
		private var _node:SListNode;
		private var _list:SLinkedList;

		/**
		 * 创建一个单向链表指针 
		 * @param list 要指向的单向链表
		 * @param node 要指向的节点
		 * 
		 */
		public function SListPointer (list:SLinkedList,node:SListNode=null)
		{
			this._list=list;
			this._node=node;
		}
		/**
		 * 移动指针到第一个元素 
		 * 
		 */
		public function first ():void
		{
			if (_list)
			{
				_node=_list.head;
			}
		}
		/**
		 * 移动指针到最后一个元素 
		 * 
		 */
		public function last ():void
		{
			if (_list)
			{
				_node=_list.tail;
			}
		}
		/**
		 * 如果有移动指针到下一个元素，否则不移动 
		 * 
		 */
		public function next ():void
		{
			if (hasNext())
			{
				_node=_node.next;
			}
		}
		/**
		 * 检测指针下一个元素是否存在，存在返回true 
		 * @return 有则返回true
		 * 
		 */
		public function hasNext ():Boolean
		{
			return Boolean(_node.next);
		}
		/**
		 * 删除指针指向的节点，并且如果存在下个节点，指针将指向下一个节点 
		 * @return 成功删除节点返回true
		 * 
		 */
		public function remove ():Boolean
		{
			return list.remove(this);
		}
		/**
		 * 获取指针所指向的节点，你可以使用 node.data 访问节点的数据 
		 * @return 节点
		 * 
		 */
		public function get node ():SListNode
		{
			return _node;
		}
		public function set node (v:SListNode):void
		{
			_node=v;
		}
		/**
		 * 获取指针所在的链表 
		 * @return 链表
		 * 
		 */
		public function get list ():SLinkedList
		{
			return _list;
		}
		public function set list (v:SLinkedList):void
		{
			_list=v;
		}
		/**
		 * 返回指针的描述 
		 * @return 其格式为[ SListPointer data] 
		 * 
		 */
		public function toString ():String
		{
			return "[ SListPointer " + _node.toString() + "]";
		}
	}
}